package com.sqsf.util;

import com.sqsf.javabean.User;
import mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;
import java.util.List;

public class UserTest {
    SqlSession session;
    UserMapper mapper;
    @Before
    public void a() {
        //1、创建SqlSessionFactory对象，也是单例模式的
        SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
        //2、创建SqlSession对象 true 自动提交事务 不写也没事 因为默认在sqlsession关闭时提交事务
        session = factory.openSession(true);
        //3、调用session的方法namespace的名字.id
        mapper = session.getMapper(UserMapper.class);

    }

    @After
    public void b() {
        //5、关闭资源
        session.close();
    }
    //mybatis为了提高查询效率 减少数据库反复执行的损耗 使用了缓存这一概念
    //mybatis默认开启一级缓存  在当前会话中相同的sql查询结果会被保存复用
    //前提是中间没有进行修改操作
    @Test
    public void selectAll1(){
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
    }
    //每个测试方法都是单独一个会话
    //所以selectAll2执行时是新的会话 所以也会出现sql语句
    //如果想对缓存进行不同会话的使用 需要开启二级缓存
    //当一个会话结束后 会将当前会话的缓存推送至二级缓存
    //这样其他会话再进行相同sql查询数据时 就会使用缓存
    //开启二级缓存
    //1)书写开启二级缓存标签
    //2)存入缓存的数据必须实现序列化接口
    @Test
    public void selectAll2(){
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~");
    }

    //在进行添加时 有些数据库可以设置id主键自增
    //这样在进行数据添加时 我们无需填入id只需要填入其余数据
    //id会自动生成
    //但是有些需求在添加完数据后要求我们使用添加数据的id进行下一步功能

    @Test
    public void insertUser(){
        User u=new User("rg2",200,new Date());
        mapper.insertUser(u);
    }
    @Test
    public void insertUser1(){
        User u=new User("rg2-1",200,new Date());
        mapper.insertUser1(u);
        System.out.println(u);
    }
    @Test
    public void insertUser2(){
        User u=new User("rg2-2",200,new Date());
        mapper.insertUser2(u);
        System.out.println(u);
    }
}